package com.huida.app.hutoolsusage;

import cn.hutool.core.lang.Console;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import static cn.hutool.core.util.NumberUtil.roundStr;

/**
 * @author wangzhuangzhuang
 * @DESC: 数学工具针对数据运算做工具性封装
 * @date 2022-01-10 16:47
 */
@SpringBootTest
public class NumberUtilUsageDemo {

	/**
	 * 加减乘除
	 * NumberUtil.add 针对数字类型做加法
	 * NumberUtil.sub 针对数字类型做减法
	 * NumberUtil.mul 针对数字类型做乘法
	 * NumberUtil.div 针对数字类型做除法
	 */

	/**
	 * 保留小数
	 *  - NumberUtil.round 方法主要封装BigDecimal中的方法来保留小数，返回BigDecimal，这个方法更加灵活，可以选择四舍五入或者全部舍弃等模式。
	 *  - NumberUtil.roundStr 方法主要封装String.format方法，舍弃方式采用四舍五入
	 * */
	@Test
	public void test01(){
		double te1 = 123456.123456;
		double te2 = 123456.128456;
		Console.log(NumberUtil.round(te1, 4)); // 123456.1235
		Console.log(NumberUtil.round(te2, 4)); // 123456.1285

		Console.log(NumberUtil.roundStr(te1, 2)); // 123456.12
		Console.log(NumberUtil.roundStr(te2, 2)); // 123456.13
	}

	/**
	 * decimalFormat 针对Decimal.format进行简单封装。按照固定格式对double或long类型的数字进行格式化操作
	 * */
	long c = 299792458; // 光速
	String format = NumberUtil.decimalFormat(".###", c); // 299,792,458

	/*
	 * 格式中主要以 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充，# 表示只要有可能就把数字拉上这个位置。
	 * 0 -> 取一位整数
	 * 0.00 -> 取一位整数和两位小数
	 * 00.000 -> 取两位整数和三位小数
	 * # -> 取所有整数部分
	 * #.##% -> 以百分比方式计数，并取两位小数
	 * #.#####E0 -> 显示为科学计数法，并取五位小数
	 * ,### -> 每三位以逗号进行分隔，例如：299,792,458
	 * 光速大小为每秒,###米 -> 将格式嵌入文本
	* */

	@Test
	public void test02(){
		// NumberUtil.isNumber 是否为数字
		System.out.println(NumberUtil.isNumber("456")); //		true
		// NumberUtil.isInteger 是否为整数
		System.out.println(NumberUtil.isInteger("456.123")); //		false
		// NumberUtil.isDouble 是否为浮点数
		System.out.println(NumberUtil.isDouble("456.123")); //		true
		// NumberUtil.isPrimes 是否为质数
		System.out.println(NumberUtil.isPrimes(123)); //		false
	}

	// 随机数
	@Test
	public void test03(){
		// NumberUtil.generateRandomNumber 生成不重复随机数，根据给定的最小数字和最大数字，以及随机数的个数，产生指定的不重复的数组
		int[] ints = NumberUtil.generateRandomNumber(0, 100, 6);
		System.out.println(ArrayUtil.toString(ints)); // eg: [43, 69, 59, 16, 3, 58]
		// NumberUtil.generateBySet 生成不重复随机数 根据给定的最小数字和最大数字，以及随机数的个数，产生指定的不重复的数组
		Integer[] integers = NumberUtil.generateBySet(0, 100, 8);
		System.out.println(ArrayUtil.toString(integers)); // eg: [72, 26, 51, 75, 22, 47, 87, 39]
	}

	// 整数列表
	// NumberUtil.range 方法根据范围和步进，生成一个有序整数列表

	/**
	 * - NumberUtil.factorial 阶乘
	 * - NumberUtil.sqrt 平方根
	 * - NumberUtil.divisor 最大公约数
	 * - NumberUtil.multiple 最小公倍数
	 * - NumberUtil.getBinaryStr 获得数字对应的二进制字符串
	 * - NumberUtil.binaryToInt 二进制转int
	 * - NumberUtil.binartyToLong 二进制转long
	 * - NumberUtil.compare 比较两个值的大小
	 * - NumberUtil.toStr 数字转字符串，自动并去除尾小数点儿后多余的0
	 * */


}